Python pathlib模块
pathlib
是 Python 内置库,Python 文档给它的定义是 Object-oriented filesystem paths(面向对象的文件系统路径)。pathlib 提供表示文件系统路径的类,其语义适用于不同的操作系统。路径类在纯路径之间划分,纯路径提供纯粹的计算操作而没有I / O,以及具体路径,它继承纯路径但也提供I / O操作。
基本用法
Path.iterdir() # 遍历目录的子目录或者文件
# 相当于os.listdir
Path.is_dir() # 判断是否是目录(文件夹)
Path.glob() # 过滤目录(返回生成器)
Path.resolve() # 返回绝对路径
Path.exists() # 判断路径是否存在
Path.open() # 打开文件(支持with)
Path.unlink() # 删除文件或目录(目录非空触发异常)
Path.glob()
>>> sorted(Path('.').glob('*.py'))
[PosixPath('pathlib.py'), PosixPath('setup.py'), PosixPath('test_pathlib.py')]
>>> sorted(Path('.').glob('*/*.py'))
[PosixPath('docs/conf.py')]
>>> sorted(Path('.').glob('**/*.py'))
[PosixPath('build/lib/pathlib.py'),
PosixPath('docs/conf.py'),
PosixPath('pathlib.py'),
PosixPath('setup.py'),
PosixPath('test_pathlib.py')]
# The "**" pattern means "this directory and all subdirectories, recursively"
Path.iterdir()
使用.iterdir
方法获取当前文件下的所以文件.
import pathlib
from collections import Counter
now_path = pathlib.Path.cwd()
gen = (i.suffix for i in now_path.iterdir())
print(Counter(gen))
# Counter({'.py': 16, '': 11, '.txt': 1, '.png': 1, '.csv': 1})
基本属性
Path.parts # 分割路径 类似os.path.split(), 不过返回元组
Path.drive # 返回驱动器名称
Path.root # 返回路径的根目录
Path.anchor # 自动判断返回drive或root
Path.parents # 返回所有上级目录的列表
改变路径
Path.with_name() # 更改路径名称, 更改最后一级路径名
Path.with_suffix() # 更改路径后缀
PurePath.with_name(name)
返回一个新的路径并修改 name。如果原本路径没有 name,ValueError 被抛出:
>>> p = PureWindowsPath('c:/Downloads/pathlib.tar.gz')
>>> p.with_name('setup.py')
PureWindowsPath('c:/Downloads/setup.py')
>>> p = PureWindowsPath('c:/')
>>> p.with_name('setup.py')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/antoine/cpython/default/Lib/pathlib.py", line 751, in with_name
raise ValueError("%r has an empty name" % (self,))
ValueError: PureWindowsPath('c:/') has an empty name
拼接路径
Path.joinpath() # 拼接路径
Path.relative_to() # 计算相对路径
测试路径
Path.match() # 测试路径是否符合pattern
Path.is_dir() # 是否是文件
Path.is_absolute() # 是否是绝对路径
Path.is_reserved() # 是否是预留路径
Path.exists() # 判断路径是否真实存在
PurePath.is_absolute()
返回此路径是否为绝对路径。如果路径同时拥有驱动器符与根路径(如果风格允许)则将被认作绝对路径。
>>> PurePosixPath('/a/b').is_absolute()
True
>>> PurePosixPath('a/b').is_absolute()
False
>>> PureWindowsPath('c:/a/b').is_absolute()
True
>>> PureWindowsPath('/a/b').is_absolute()
False
>>> PureWindowsPath('c:').is_absolute()
False
>>> PureWindowsPath('//some/share').is_absolute()
True
PurePath.match(pattern)
将此路径与提供的通配符风格的模式匹配。如果匹配成功则返回 True,否则返回 False。 如果 pattern 是相对的,则路径可以是相对路径或绝对路径,并且匹配是从右侧完成的:
>>> PurePath('a/b.py').match('*.py')
True
>>> PurePath('/a/b/c.py').match('b/*.py')
True
>>> PurePath('/a/b/c.py').match('a/*.py')
False
其他方法
Path.cwd() # 返回当前目录的路径对象
Path.home() # 返回当前用户的home路径对象
Path.stat() # 返回路径信息, 同os.stat()
Path.chmod() # 更改路径权限, 类似os.chmod()
Path.expanduser() # 展开~返回完整路径对象
Path.mkdir() # 创建目录
Path.rename() # 重命名路径
Path.rglob() # 递归遍历所有子目录的文件
列出指定类型的文件
p = pathlib.Path('./')
# print([str(x) for x in p.iterdir() ])
print([i for i in p.glob('*.py')])
#[WindowsPath('01.py'), WindowsPath('2018年Tibet温度统计.py'),
# WindowsPath('lob.py')]
列出所有子目录
import pathlib
p = pathlib.Path('./')
print([x for x in p.iterdir() if x.is_dir()])
#当前目录所有文件
p = pathlib.Path('./')
print([x for x in p.iterdir() ])
#[WindowsPath('.idea'), WindowsPath('01.py'), WindowsPath('数据下载.xlsx'), WindowsPath('数据下载3.xlsx')]
#转化为字符串
p = pathlib.Path('./')
print([str(x) for x in p.iterdir() ])
#['.idea', '01.py', '数据下载.xlsx', '数据下载3.xlsx']
路径拼接 可以使用/符号来拼接路径
p = pathlib.Path('./')
# print([str(x) for x in p.iterdir() ])
q = pathlib.Path(r'F:\cookies\python')
print([str(q/i ) for i in p.glob('*.py')])
print([str(q.joinpath(i)) for i in p.glob('*.py')])
'''
['F:\\cookies\\python\\01.py', 'F:\\cookies\\python\\2018年Tibet温度统计.py', 'F:\\cookies\\python\\lob.py']
['F:\\cookies\\python\\01.py', 'F:\\cookies\\python\\2018年Tibet温度统计.py', 'F:\\cookies\\python\\lob.py']
'''
p = pathlib.Path(r'F:\cookies\python')
q = p / 'learnPython'
print(q)
#F:\cookies\python\learnPython
data_folder = Path("source_data/text_files/")
file_to_open = data_folder / "raw_data.txt"
打开文件
>>> q = q / "hello_world.py"
>>> with q.open() as f:
>>> print(f.readline())
#!/usr/bin/env python
PurePath
PurePath 是一个纯路径对象,纯路径对象提供了实际上不访问文件系统的路径处理操作。有三种方法可以访问这些类,我们也称之为flavor。
一个通用的类,代表当前系统的路径风格(实例化为 PurePosixPath
或者 PureWindowsPath
):
产生Pure paths的三种方式
class pathlib.PurePath(*pathsegments)
m=pathlib.PurePath('foo', 'some/path', 'bar')
print(m) #foo\some\path\bar
n=pathlib.PureWindowsPath('foo', 'some/path', 'bar')
print(n) #foo\some\path\bar
pa=pathlib.PurePath(pathlib.Path('foo'), pathlib.Path('bar'))
print(pa) #foo\bar
pa=pathlib.PureWindowsPath('foo','bar')
print(pa) #foo\bar
如果参数为空,则默认指定当前文件夹
print(pathlib.PurePath())
#.
当同时指定多个绝对路径,则使用最后一个
>>> PureWindowsPath('c:/Windows', 'd:bar')
PureWindowsPath('d:bar')
class pathlib.PurePosixPath(*pathsegments)
一个 PurePath 的子类,路径风格不同于 Windows 文件系统:
class pathlib.PureWindowsPath(*pathsegments)
PurePath 的一个子类,路径风格为 Windows 文件系统路径:
常用属性和方法
返回驱动路径名称
>>> PureWindowsPath('c:/Program Files/').drive
'c:'
不太明白
print(pathlib.PureWindowsPath(r'c:/Program Files/').root) #\
name 获取文件名
p = Path(r'd:\test\tt.txt.bk')
p.name # 获取文件名
PureWindowsPath(r'd:\test\tt.txt.bk').name
获取文件的信息(size,createtime...)
p = Path(r'd:\test\tt.txt')
p.stat() # 获取详细信息
# os.stat_result(st_mode=33206, st_ino=562949953579011, st_dev=3870140380, st_nlink=1, st_uid=0, st_gid=0, st_size=0, st_atime=1525254557, st_mtime=1525254557, st_ctime=1525254557)
p.stat().st_size # 文件大小
# 0
p.stat().st_ctime # 创建时间
# 1525254557.2090347
# 其他的信息也可以通过相同方式获取
p.stat().st_mtime # 修改时间
parents属性
获取不同等级的根目录
>>> p = PureWindowsPath('c:/foo/bar/setup.py')
>>> p.parents[0]
PureWindowsPath('c:/foo/bar')
>>> p.parents[1]
PureWindowsPath('c:/foo')
>>> p.parents[2]
PureWindowsPath('c:/')
此路径的逻辑父路径: PurePath.parent
>>> p = PurePosixPath('/a/b/c/d')
>>> p.parent
PurePosixPath('/a/b/c')
访问个别部分:parts
一个元组,可以访问路径的多个组件:
>>> p = PurePath('/usr/bin/python3')
>>> p.parts
('/', 'usr', 'bin', 'python3')
>>> p = PureWindowsPath('c:/Program Files/PSF')
>>> p.parts
('c:\\', 'Program Files', 'PSF')
PurePath.name属性
可以获取文件的名字,包含拓展名。
>>> PureWindowsPath('//some/share/setup.py').name
'setup.py'
>>> PureWindowsPath('//some/share').name
''
PurePath.suffix
最后一个组件的文件扩展名,如果存在::PurePath.suffix
、
路径的文件扩展名列表:PurePath.suffixes
属性
>> PurePosixPath('my/library/setup.py').suffix
'.py'
>>> PurePosixPath('my/library.tar.gz').suffix
'.gz'
>>> PurePosixPath('my/library').suffix
''
>>> PurePosixPath('my/library.tar.gar').suffixes
['.tar', '.gar']
>>> PurePosixPath('my/library.tar.gz').suffixes
['.tar', '.gz']
>>> PurePosixPath('my/library').suffixes
[]
PurePath.stem
最后一个路径组件,除去后缀:
>>> PurePosixPath('my/library.tar.gz').stem
'library.tar'
>>> PurePosixPath('my/library.tar').stem
'library'
>>> PurePosixPath('my/library').stem
'library'
PurePath.with_suffix(suffix)
返回一个新的路径并修改 suffix。如果原本的路径没有后缀,新的 suffix 则被追加以代替。如果 suffix 是空字符串,则原本的后缀被移除:
>>> p = PureWindowsPath('c:/Downloads/pathlib.tar.gz')
>>> p.with_suffix('.bz2')
PureWindowsPath('c:/Downloads/pathlib.tar.bz2')
>>> p = PureWindowsPath('README')
>>> p.with_suffix('.txt')
PureWindowsPath('README.txt')
参考